#include "patron.h"
#include "proyecto.h"
#include "asistentexml.h"

Patron::Patron()
{
    d = new d_Patron;
}

Patron::Patron(const Patron& patron) : d(patron.d)
{
}

Patron::Patron(const Compas& compas)
{
    d = new d_Patron;
    d->nombre = compas.getNombre();
    d->listaCompases.append(compas);
}

Patron::~Patron()
{

}

int Patron::getNumeroCompases() const
{
    return d->listaCompases.size();
}

Compas Patron::getCompas(int numeroCompas) const
{
    if (numeroCompas < 0) {
        return Compas();    
    }
    int indice = numeroCompas % d->listaCompases.size();    
    
    return d->listaCompases.value(indice);
}

int Patron::getNumeroPulsos() const
{
    int numeroPulsos = 0;
    foreach (Compas compas, d->listaCompases) {
        numeroPulsos += compas.getNumeroPulsos();
    }
    return numeroPulsos;
}

void Patron::serializar(QDomElement& elementoPatron) const
{
    AsistenteXml asistente(elementoPatron.ownerDocument());

    asistente.escribirAtributo(elementoPatron, "nombre", getNombre());

    foreach (Compas compas, d->listaCompases) {
        QDomElement elementoCompas = asistente.escribirElemento(elementoPatron, "compas");
        asistente.escribirAtributo(elementoCompas, "nombre", compas.getNombre());
    }
}

void Patron::deserializar(const QDomElement& elementoPatron, Proyecto* proyecto)
{
    AsistenteXml asistente(elementoPatron.ownerDocument());

    setNombre(asistente.leerAtributo(elementoPatron, "nombre"));
    d->listaCompases.clear();
    QList<QDomElement> listaElementosCompas = asistente.leerElementos(elementoPatron, "compas");
    foreach (QDomElement elementoCompas, listaElementosCompas) {
        QString nombreCompas = asistente.leerAtributo(elementoCompas, "nombre");
        Compas compas = proyecto->getCompas(nombreCompas);
        if (compas.esValido()) {
            d->listaCompases.append(compas);
        }
    }
}

QVariant Patron::get(const QString& nombreAtributo) const
{
	GET_ATR(getNombre())
    GET_DEF
}

int Patron::getAncho(const QString& nombreAtributo) const
{
    ANCHO_ATR(getNombre(), 200)
    ANCHO_DEF
}